﻿using System;
using System.Windows;
using System.Windows.Threading;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Clientes.Model;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;
using Sinacor.UI.Bovespa.Corretagem.Model;
using Sinacor.UI.Bovespa.Corretagem.Presenter;
using Sinacor.UI.Bovespa.Ordens.View.SmartClient;
using System.Windows.Input;

namespace Sinacor.UI.Bovespa.Corretagem.View.SmartClient
{
    /// <summary>
    /// Interaction logic for CadastroFormadorMercado.xaml
    /// </summary>
    public partial class CadastroFormadorMercado : SinacorWindow, ICadastroFormadorMercado
    {
        #region Campos

        public Presenter.CadastroFormadorMercado PresenterCadastroFormadorMercado { get; set; }
        private object objectValidated = null;

        #region Constantes

        #endregion

        #endregion

        #region Construtores

        public CadastroFormadorMercado()
        {
            InitializeComponent();

            PresenterCadastroFormadorMercado = new Presenter.CadastroFormadorMercado(this);

            dtgFormadorMercado.NewItemType = typeof(Model.FormadorMercado);

            DataContext = PresenterCadastroFormadorMercado;

            AfterInitialize += new RoutedEventHandler(Inicializar);

            //Carregar combo Tipo de Mercado

            PresenterCadastroFormadorMercado.CarregarTipoMercado();
            cmbTipoMercado.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        #endregion

        #region Eventos

        private void Inicializar(object sender, RoutedEventArgs e)
        {
            ShowUserWaitingProcess();
            dtgFormadorMercado.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            HideUserWaitingProcess();
        }

        #region Campos de pesquisa
        private void txtFiltroApelido_LostFocus(object sender, RoutedEventArgs e)
        {
            object[] parm = { e };
            this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new RoutedEventHandler(txtFiltroApelidoLostFocus), sender, parm);
        }

        private void txtFiltroApelidoLostFocus(object sender, RoutedEventArgs e)
        {
            ShowUserWaitingProcess();
            PresenterCadastroFormadorMercado.ValidarApelidoCliente();
            HideUserWaitingProcess();
        }

        /// <summary>
        /// FGualberto.7Comm 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void txtApelidoCliente_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.F3)
            {
                SinacorTextBox txtApelido = (SinacorTextBox)sender;
                string apelido = CarregarTelaPesquisaApelido(txtApelido.Text);
                if (apelido != "")
                {
                    txtApelido.Text = apelido;
                }
            }
        }

        #endregion

        #region botões
        private void btnPesquisar_Click(object sender, RoutedEventArgs e)
        {
            cancelGridEditing();
            if (DtpDataFim.Validate() && DtpDataInicio.Validate())
            {
                this.ShowUserWaitingProcess();
                PresenterCadastroFormadorMercado.ConsultarFormadoresMercados();
                this.HideUserWaitingProcess();
            }
        }

        private void BtnCliente_Click(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            cancelGridEditing();

            string apelido = CarregarTelaPesquisaApelido(txtFiltroApelido.Text);
            if (apelido != "")
            {
                this.txtFiltroApelido.Text = apelido;
            }

            this.HideUserWaitingProcess();
        }

        private void BtnAtivo_Click(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ShowUserWaitingProcess();
            cancelGridEditing();
            Sinacor.UI.Bovespa.Ordens.Model.Titulo modelTitulo = new Sinacor.UI.Bovespa.Ordens.Model.Titulo();
            modelTitulo = CarregarTelaPesquisaAtivoPorObjeto(txtFiltroAtivo.Text);
            if (modelTitulo.Codigo != "")
            {
                this.txtFiltroAtivo.Text = modelTitulo.Codigo;
                this.txtFiltroIsin.Text = modelTitulo.Isin;
            }
            this.HideUserWaitingProcess();
        }

        private void btnNovaPesquisa_Click(object sender, RoutedEventArgs e)
        {
            this.ClearServiceErrors();
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.ApelidoCliente = null;
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.Ativo = null;
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.CodigoCliente = null;
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.DataFinal = null;
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.DataInicial = null;
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.PercentualDesconto = null;
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.TipoMercado = null;
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.Isin = null;
            this.DtpDataInicio.Value = null;
            this.DtpDataFim.Value = null;
            PresenterCadastroFormadorMercado.ListaFormadorMercado.Clear();
            this.AtualizarFormadorMercado();

            ClearServiceErrors();

        }
        #endregion

        #region Grid
        private void cancelGridEditing()
        {
            if (dtgFormadorMercado.IsInserting)
                dtgFormadorMercado.CancelInsert();
            else if (dtgFormadorMercado.IsUpdating)
                dtgFormadorMercado.CancelUpdate();
        }

        private void dtgFormadorMercado_EndingInsert(object sender, CancelItemEventArgs e)
        {
            try
            {
                if (e.OriginalSource is BaseRow)
                {
                    ClearServiceErrors();


                    if (!((IValidatableContainer)sender).ValidateContainer() || HasErrors)
                    {
                        e.Cancel = true;
                        return;
                    }

                    Model.FormadorMercado baseline = ((Model.FormadorMercado)e.ItemInfo.Item);
                    e.Cancel = !PresenterCadastroFormadorMercado.IncluirFormadorMercado(baseline);

                }
            }
            catch
            {
                e.Cancel = true;
            }
        }

        private void dtgFormadorMercado_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            try
            {
                if (e.OriginalSource is BaseRow)
                {
                    ClearServiceErrors();


                    if (!((IValidatableContainer)sender).ValidateContainer() || HasErrors)
                    {
                        e.Cancel = true;
                        return;
                    }

                    Model.FormadorMercado baseline = ((Model.FormadorMercado)e.ItemInfo.Item);

                    e.Cancel = !PresenterCadastroFormadorMercado.AlterarFormadorMercado(baseline);

                }
            }
            catch
            {
                e.Cancel = true;
            }
        }

        private void dtgFormadorMercado_Deleting(object sender, CancelItemsEventArgs e)
        {
            Model.FormadorMercado itemFormadorMercado = ((Model.FormadorMercado)dtgFormadorMercado.SelectedItem);

            if (itemFormadorMercado != null)
                e.Cancel = !PresenterCadastroFormadorMercado.ExcluirFormadorMercado(itemFormadorMercado);

            ClearServiceErrors();

            if (HasErrors)
                e.Cancel = true;

        }

        private void dtgFormadorMercado_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            if (e.OldCell != null && this.dtgFormadorMercado.GetInsertionRow().Item != null)
            {
                ClearServiceErrors();

                switch (e.OldCell.Name)
                {
                    case "Ativo":
                        SinacorTextBox textAtivo = null;
                        textAtivo = (SinacorTextBox)ControlHelper.FindChild(this.dtgFormadorMercado.GetInsertionRow(), "txtAtivo");

                        if (textAtivo != null)
                        {
                            ShowUserWaitingProcess();

                            if (!PresenterCadastroFormadorMercado.ValidarAtivo(textAtivo.Text))
                            {
                                objectValidated = textAtivo;
                                textAtivo.Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(MantemFoco));
                            }
                            HideUserWaitingProcess();
                        }
                        break;
                    case "Cliente":
                        SinacorTextBox textCliente = null;
                        textCliente = (SinacorTextBox)ControlHelper.FindChild(this.dtgFormadorMercado.GetInsertionRow(), "txtApelidoCliente");
                        if (textCliente != null)
                        {
                            ShowUserWaitingProcess();
                            if (!PresenterCadastroFormadorMercado.ValidarApelidoCliente(textCliente.Text))
                            {
                                objectValidated = textCliente;
                                textCliente.Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(MantemFoco));
                            }

                            HideUserWaitingProcess();
                        }
                        break;
                }
            }

        }

        private void MantemFoco()
        {
            if (objectValidated != null)
            {
                ((SinacorTextBox)this.objectValidated).Focus();
            }

        }

        #endregion

        #endregion

        #region ICadastroFormadorMercado Members

        public void AtualizarFormadorMercado()
        {
            this.dtgFormadorMercado.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public bool ConfirmarExclusaoFormadorMercado()
        {
            SinacorMessageBoxResult confirmacao = SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.ConfirmaExclusaoFormadorMercado").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return confirmacao == SinacorMessageBoxResult.Yes ? true : false;
        }

        public void InformarApelidoObrigatorio()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.ApelidoClienteObrigatorio").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        public void InformarAtivoInvalido()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.AtivoInvalido").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarAtivoNaoCadastrado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.AtivoInvalido").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarAtivoObrigatorio()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.AtivoObrigatorio").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarClienteAtivoDuplicado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.ClienteAtivoDuplicado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarClienteNaoCadastrado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.ClienteDesativado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarDataFinalInvalida()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.DataFinalInvalida").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarDataFinalMenorInicial()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.DataFinalMenorInicial").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarDataFinalSemInicial()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.DataInicialPeriodoObrigatoria").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarPercentualDescontoInvalido()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.DescontoInvalido").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarPercentualDescontoObrigatorio()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.DescontoObrigatorio").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarRegistroNaoEncontrado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.RegistroNaoencontrado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
            dtgFormadorMercado.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void InformarSelecioneUmRegistro()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.SelecioneRegistroExcluido").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarDataFinalObrigatoria()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.DataFinalVigenteObrigatoria").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarDataInicialObrigatoria()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.DataInicialVigenteObrigatoria").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarExclusaoSucesso()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.ClienteFormadorExcluidoSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarPercentualDescontoNegativo()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.DescontoNegativo").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        #endregion

        private void txtFiltroApelido_PreviewLostKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
        {
            if (e.NewFocus.GetType() == typeof(SinacorButton))
            {
                SinacorButton btn = (SinacorButton)e.NewFocus;
                if (btn.Name == "BtnPesquisar")
                {
                    cancelGridEditing();
                }
            }
        }

        /// <summary>
        /// Carregar a tela para pesquisa do Apelido
        /// </summary>
        /// <returns>Apelido informado</returns>
        private string CarregarTelaPesquisaApelido(string filtroApelido)
        {
            //carrega a model de clientes
            PesquisaCliente modelPesquisaCliente = new PesquisaCliente();
            modelPesquisaCliente.Apelido = filtroApelido;

            //Chama a tela de pesquisa
            PesquisaClientes pesquisaCliente = new PesquisaClientes();
            pesquisaCliente.Owner = this;
            pesquisaCliente.SetMenuHeader("Bovespa.Clientes.Label.PesquisaClientesMenuHeader");
            pesquisaCliente.CarregaParametros(Clientes.Model.Enum.JanelaChamada.CadastroFormadorMercado, modelPesquisaCliente);
            pesquisaCliente.ShowDialog();
            //Atribui o retorno ao campo de pesquisa
            if (pesquisaCliente.PesquisaClienteModel.Apelido != null)
            {
                return pesquisaCliente.PesquisaClienteModel.Apelido;
            }
            else
            {
                return "";
            }
        }

        /// <summary>
        /// Carregar a Tela dos Ativos
        /// </summary>
        /// <param name="filtroAtivo"></param>
        /// <returns>Código do Ativo Escolhido</returns>
        private string CarregarTelaPesquisaAtivo(string filtroAtivo)
        {
            Sinacor.UI.Bovespa.Ordens.Model.Titulo modelTitulo = new Sinacor.UI.Bovespa.Ordens.Model.Titulo();
            modelTitulo.Codigo = filtroAtivo;

            //Chama a Tela Pesquisa Ativo
            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, Ordens.Model.Enum.TelaChamadora.CadastroFormadorMercado);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Ordens.Label.PesquisaTitulo");
            pesquisaTitulo.ShowDialog();
            //Atribui o retorno ao campo de pesquisa
            if (pesquisaTitulo.TituloEscolhido != null)
            {
                return pesquisaTitulo.TituloEscolhido.Codigo;
            }
            else
            {
                return "";
            }
        }

        private Sinacor.UI.Bovespa.Ordens.Model.Titulo CarregarTelaPesquisaAtivoPorObjeto(string filtroAtivo)
        {
            Sinacor.UI.Bovespa.Ordens.Model.Titulo modelTitulo = new Sinacor.UI.Bovespa.Ordens.Model.Titulo();
            modelTitulo.Codigo = filtroAtivo;

            //Chama a Tela Pesquisa Ativo
            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, Ordens.Model.Enum.TelaChamadora.CadastroFormadorMercado);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Ordens.Label.PesquisaTitulo");
            pesquisaTitulo.ShowDialog();
            //Atribui o retorno ao campo de pesquisa
            if (pesquisaTitulo.TituloEscolhido != null)
            {
                return pesquisaTitulo.TituloEscolhido;
            }
            else
            {
                return null;
            }
        }

        private void txtAtivo_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.F3)
            {
                SinacorTextBox txtAtivo = (SinacorTextBox)sender;
                string ativo = CarregarTelaPesquisaAtivo(txtAtivo.Text);
                if (ativo != "")
                {
                    txtAtivo.Text = ativo;
                }
            }
        }

        private void dtgFormadorMercado_Inserted(object sender, ItemEventArgs e)
        {
            PresenterCadastroFormadorMercado.ConsultarFormadoresMercados();
        }

        private void cmbTipoMercado_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            //PresenterCadastroFormadorMercado.FiltroFormadorMercado.TipoMercado = (Nullable<Model.Enum.TipoMercado>)((SinacorComboBox)sender).SelectedItem;
            PresenterCadastroFormadorMercado.FiltroFormadorMercado.TipoMercado = (Nullable<Model.Enum.TipoMercado>)((SinacorComboBox)sender).SelectedValue;


        }


    }
}